From adb16c5b89e606ec6293d9e96295ab0b88b655eb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 30 Aug 2005 04:46:09 +0000 Subject: [PATCH] Add a deletable property with getter and setter, to control the close 2005-08-30 Matthias Clasen * gtk/gtk.symbols: * gtk/gtkwindow.h: * gtk/gtkwindow.c: Add a deletable property with getter and setter, to control the close button in the window frame. (#59718, Havoc Pennington) --- ChangeLog | 8 +++ ChangeLog.pre-2-10 | 8 +++ docs/reference/ChangeLog | 4 ++ docs/reference/gtk/gtk-sections.txt | 2 + gtk/gtk.symbols | 2 + gtk/gtkwindow.c | 99 +++++++++++++++++++++++++++++ gtk/gtkwindow.h | 3 + 7 files changed, 126 insertions(+) diff --git a/ChangeLog b/ChangeLog index d7b10ec587..2f85cd69ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-08-30 Matthias Clasen + + * gtk/gtk.symbols: + * gtk/gtkwindow.h: + * gtk/gtkwindow.c: Add a deletable property with getter + and setter, to control the close button in the window + frame. (#59718, Havoc Pennington) + 2005-08-29 Matthias Clasen * gtk/gtkrc.key.emacs: Add C-n/C-p/C-f/C-b as alternatives diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d7b10ec587..2f85cd69ab 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,11 @@ +2005-08-30 Matthias Clasen + + * gtk/gtk.symbols: + * gtk/gtkwindow.h: + * gtk/gtkwindow.c: Add a deletable property with getter + and setter, to control the close button in the window + frame. (#59718, Havoc Pennington) + 2005-08-29 Matthias Clasen * gtk/gtkrc.key.emacs: Add C-n/C-p/C-f/C-b as alternatives diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 53691e6456..baf49e9d9f 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +2005-08-30 Matthias Clasen + + * gtk/gtk-sections.txt: Add gtk_window_[sg]et_deletable. + 2005-08-29 Matthias Clasen * gtk/tmpl/gtkstatusicon.sgml: Add a long description. diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index b83fb13a81..c2e43b41f1 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -4771,6 +4771,7 @@ gtk_window_set_keep_below gtk_window_begin_resize_drag gtk_window_begin_move_drag gtk_window_set_decorated +gtk_window_set_deletable gtk_window_set_frame_dimensions gtk_window_set_has_frame gtk_window_set_mnemonic_modifier @@ -4782,6 +4783,7 @@ gtk_window_set_urgency_hint gtk_window_set_accept_focus gtk_window_set_focus_on_map gtk_window_get_decorated +gtk_window_get_deletable gtk_window_get_default_icon_list gtk_window_get_default_size gtk_window_get_destroy_with_parent diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index f0ea5cbdbb..1cd9e596e7 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -3930,6 +3930,7 @@ gtk_window_deiconify gtk_window_fullscreen gtk_window_get_accept_focus gtk_window_get_decorated +gtk_window_get_deletable gtk_window_get_default_icon_list gtk_window_get_default_size gtk_window_get_destroy_with_parent @@ -3979,6 +3980,7 @@ gtk_window_resize gtk_window_set_accept_focus gtk_window_set_auto_startup_notification gtk_window_set_decorated +gtk_window_set_deletable gtk_window_set_default gtk_window_set_default_icon gtk_window_set_default_icon_from_file PRIVATE diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 6264f51d64..b318a99b64 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -87,6 +87,7 @@ enum { PROP_ACCEPT_FOCUS, PROP_FOCUS_ON_MAP, PROP_DECORATED, + PROP_DELETABLE, PROP_GRAVITY, /* Readonly properties */ @@ -170,6 +171,7 @@ struct _GtkWindowPrivate guint urgent : 1; guint accept_focus : 1; guint focus_on_map : 1; + guint deletable : 1; }; static void gtk_window_class_init (GtkWindowClass *klass); @@ -634,6 +636,22 @@ gtk_window_class_init (GtkWindowClass *klass) TRUE, GTK_PARAM_READWRITE)); + /** + * GtkWindow:deletable: + * + * Whether the window frame should have a close button. + * + * Since: 2.10 + */ + g_object_class_install_property (gobject_class, + PROP_DELETABLE, + g_param_spec_boolean ("deletable", + P_("Deletable"), + P_("Whether the window frame should have a close button"), + TRUE, + GTK_PARAM_READWRITE)); + + /** * GtkWindow:gravity: * @@ -783,6 +801,7 @@ gtk_window_init (GtkWindow *window) priv->accept_focus = TRUE; priv->focus_on_map = TRUE; + priv->deletable = TRUE; colormap = _gtk_widget_peek_colormap (); if (colormap) @@ -892,6 +911,9 @@ gtk_window_set_property (GObject *object, case PROP_DECORATED: gtk_window_set_decorated (window, g_value_get_boolean (value)); break; + case PROP_DELETABLE: + gtk_window_set_deletable (window, g_value_get_boolean (value)); + break; case PROP_GRAVITY: gtk_window_set_gravity (window, g_value_get_enum (value)); break; @@ -996,6 +1018,9 @@ gtk_window_get_property (GObject *object, case PROP_DECORATED: g_value_set_boolean (value, gtk_window_get_decorated (window)); break; + case PROP_DELETABLE: + g_value_set_boolean (value, gtk_window_get_deletable (window)); + break; case PROP_GRAVITY: g_value_set_enum (value, gtk_window_get_gravity (window)); break; @@ -2432,6 +2457,74 @@ gtk_window_get_decorated (GtkWindow *window) return window->decorated; } +/** + * @window: a #GtkWindow + * @setting: %TRUE to decorate the window as deletable + * + * By default, windows have a close button in the window frame. Some + * window managers allow GTK+ to + * disable this button. If you set the deletable property to %FALSE + * using this function, GTK+ will do its best to convince the window + * manager not to show a close button. Depending on the system, this + * function may not have any effect when called on a window that is + * already visible, so you should call it before calling gtk_window_show(). + * + * On Windows, this function always works, since there's no window manager + * policy involved. + * + * Since: 2.10 + */ +void +gtk_window_set_deletable (GtkWindow *window, + gboolean setting) +{ + GtkWindowPrivate *priv; + + g_return_if_fail (GTK_IS_WINDOW (window)); + + priv = GTK_WINDOW_GET_PRIVATE (window); + + setting = setting != FALSE; + + if (setting == priv->deletable) + return; + + priv->deletable = setting; + + if (GTK_WIDGET (window)->window) + { + if (priv->deletable) + gdk_window_set_functions (GTK_WIDGET (window)->window, + GDK_FUNC_ALL); + else + gdk_window_set_functions (GTK_WIDGET (window)->window, + GDK_FUNC_ALL | GDK_FUNC_CLOSE); + } + + g_object_notify (G_OBJECT (window), "deletable"); +} + +/** + * gtk_window_get_deletable: + * @window: a #GtkWindow + * + * Returns whether the window has been set to have a close button + * via gtk_window_set_deletable(). + * + * Return value: %TRUE if the window has been set to have a close button + **/ +gboolean +gtk_window_get_deletable (GtkWindow *window) +{ + GtkWindowPrivate *priv; + + g_return_val_if_fail (GTK_IS_WINDOW (window), TRUE); + + priv = GTK_WINDOW_GET_PRIVATE (window); + + return priv->deletable; +} + static GtkWindowIconInfo* get_icon_info (GtkWindow *window) { @@ -4058,9 +4151,12 @@ gtk_window_realize (GtkWidget *widget) GdkWindow *parent_window; GdkWindowAttr attributes; gint attributes_mask; + GtkWindowPrivate *priv; window = GTK_WINDOW (widget); + priv = GTK_WINDOW_GET_PRIVATE (window); + /* ensure widget tree is properly size allocated */ if (widget->allocation.x == -1 && widget->allocation.y == -1 && @@ -4182,6 +4278,9 @@ gtk_window_realize (GtkWidget *widget) if (!window->decorated) gdk_window_set_decorations (widget->window, 0); + if (!priv->deletable) + gdk_window_set_functions (widget->window, GDK_FUNC_ALL | GDK_FUNC_CLOSE); + gdk_window_set_type_hint (widget->window, window->type_hint); if (gtk_window_get_skip_pager_hint (window)) diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h index 6d60912c02..38e81fd8d0 100644 --- a/gtk/gtkwindow.h +++ b/gtk/gtkwindow.h @@ -257,6 +257,9 @@ void gtk_window_get_frame_dimensions (GtkWindow *window, void gtk_window_set_decorated (GtkWindow *window, gboolean setting); gboolean gtk_window_get_decorated (GtkWindow *window); +void gtk_window_set_deletable (GtkWindow *window, + gboolean setting); +gboolean gtk_window_get_deletable (GtkWindow *window); void gtk_window_set_icon_list (GtkWindow *window, GList *list); -- 2.30.2